package Fases 
{
	import flash.display.Sprite;
	import flash.geom.Rectangle;
	import flash.text.Font;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.ui.Keyboard;
	import HUD.HudJogo;
	import Inimigos.Inimigo;
	import TangoGames.Atores.AtorBase;
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import TangoGames.Fases.*;
	import TangoGames.Utils;
	
	/**
	 * ...
	 * @author Arthur&Honorato
	 */
	public class Fase01 extends FaseBase implements FaseInterface
	{
		//tamanho do mapa
		private var UI_mapa_Largura			:uint; 
		private var UI_mapa_Altura			:uint; 
		
		//fundo do mapa
		private var MC_backGround			:Sprite;
		private var RE_limGlob				:Rectangle;
		
		//HUD
		private var hud:HudJogo;
		
		//heroi
		private var AH_Heroi				:Heroi;
		private var AL_LuzAtor 				:LuzAtor; 
		
		//limite de batimentos cardiacos
		private var UI_Batimentos_Limite	:uint;

		//Quantidade máxima de inimigos
		private var UI_Inimigos_Qtd_Max		:uint;
		private var UI_qtd_inimigos			:uint;
			
		//Controle de Waves
		private var UI_wave_corrente		:uint;
		private var UI_wave_qtq_ini 		:uint;
		
		//
		var TF:TextField ;
		
		public function Fase01(_main:DisplayObjectContainer, _faseCtr:FaseControle, _faseID:uint, _nivel:uint) {
			super(_main, _faseCtr, _faseID, _nivel);
			
			//tamanho do mapa
			UI_mapa_Largura			= param[FasesJogoParametros.PARAM_FASE_TAMANHO_LARGURA];
			UI_mapa_Altura			= param[FasesJogoParametros.PARAM_FASE_TAMANHO_ALTURA];
			
			UI_Batimentos_Limite	= param[FasesJogoParametros.PARAM_BATIMENTOS_CARDIACO_LIMITE];
			
			UI_Inimigos_Qtd_Max 	= param[FasesJogoParametros.PARAM_INIMIGOS_QTD_MAXIMA];
			
			MC_backGround = new Fase1BKG();
			
			//MC_backGround = geraFundo();
			this.addChild(MC_backGround);
			MC_backGround.x = 0;
			MC_backGround.y = 0;
			
			this.addEventListener(FaseEvent.ATOR_CRIADO	, onAtorCriado	,false,0,true);
			
			this.addEventListener(FaseEvent.ATOR_REMOVIDO, onAtorRemovido , false, 0, true);
			
			TF = new TextField
			TF.selectable = false;
			TF.autoSize = TextFieldAutoSize.LEFT;
			var TF_formatacao:TextFormat = new TextFormat;
			TF_formatacao.size = 20;
			TF_formatacao.bold = true;
			TF_formatacao.color = 0xFFFFFF;
			var FT_fonte:Font = new Font;
			//FT_fonte.fontName = "Arial";
			TF_formatacao.font = FT_fonte.fontName;
			TF.mouseEnabled = false;
			TF.defaultTextFormat = TF_formatacao;
		}
		
		private function onAtorRemovido(e:FaseEvent):void 
		{
			if ( e.ator is Inimigo) UI_qtd_inimigos --;

		}
		
		private function onAtorCriado(e:FaseEvent):void 
		{
			if ( e.ator is Inimigo) UI_qtd_inimigos ++;
		}
		
		/* INTERFACE TangoGames.Fases.FaseInterface */
		
		public function reiniciacao():void 
		{
			//remove inimigos antigos
			var ator:AtorBase;
			for each (ator in Atores) { 
				if ( ! ( ator is Heroi || ator is LuzAtor ) )
					ator.marcadoRemocao = true;
			}
			
			UI_qtd_inimigos = 0;
			
			//heroi
			AH_Heroi.x = stage.stageWidth  / 2 ;
			AH_Heroi.y = stage.stageHeight  / 2 ;
			
			UI_qtd_inimigos 	= 0;
			UI_wave_qtq_ini 	= 5;
			UI_wave_corrente 	= 0;
			
		}
		
		public function inicializacao():Boolean 
		{
			//coloca medidor de FPS
			adicionaHUD(new FaseFPS());
								
			//limites de deslocamento
			RE_limGlob = new Rectangle( 0 , 0 ,  this.width , this.height);
			
			//cria Heroi;
			AH_Heroi = new Heroi;
			AL_LuzAtor = new LuzAtor ( AH_Heroi );
			adicionaAtor(AH_Heroi);
			AH_Heroi.adcionaClassehitGrupo(Inimigo);
			adicionaAtor(AL_LuzAtor);
			AL_LuzAtor.adcionaClassehitGrupo(Inimigo);
			
			//adicionar a HUD
			hud = new HudJogo();					
			
			hud.HeroiHud = AH_Heroi;

			adicionaHUD(hud);
			
			reiniciacao();
			
			return true;
		}
		
		public function update(e:Event):void 
		{
			
			//termina o jogo
			if ( AH_Heroi.Batimentos_Corrente > UI_Batimentos_Limite ) {
				terminoFase();
				return;
			}

/*			//ganhou o jogo
			if ( situacao de vitoria) {
				
				//conclui fase 
				if ( FC_faseDados.faseLiberada < faseID ) FC_faseDados.faseLiberada = faseID;
				FC_faseDados.totalPontos = UI_pontos;
				FC_faseDados.salvaDados();
				
				concluidaFase();
				return;
			}*/
			
			//Pressionado pausa do Jogo
			if (pressTecla1(Keyboard.P))
			{
				pausaFase();
			}
				
			if (UI_qtd_inimigos == 0) geraWavesInimigos();
			
		}
		
		
		public function remocao():void 
		{
			stage.removeChild(TF);
		}
		
		
		public function colisao(C1:AtorBase, C2:AtorBase):void 
		{
			if (C1 is Inimigo && C2 is Inimigo )
			{
				Inimigo(C1).colidiu(C2);
				return;
			}
			
			if (C1 is LuzAtor && C2 is Inimigo )
			{
				Inimigo(C2).colidiu(C1);
				return;
			}
			
			if (C1 is Heroi && C2 is Inimigo )
			{
				Heroi(C1).susto(Inimigo(C2));
			}
			
		}
		
		/***********************************************************
		* geracao dos Inimigos
		* *********************************************************/

		private function geraWavesInimigos():void 
		{
			for (var i:uint = 0 ; i < UI_wave_qtq_ini ; i++) 
			{
				var ini:Inimigo = new Inimigo();
				var sort:uint = Math.floor(Math.random() * 4);
				sorteiaInimigo(ini, sort)
				ini.Alvo = AH_Heroi;
				adicionaAtor(ini);
				ini.adcionaClassehitGrupo(Inimigo);
				ini.adcionaClassehitGrupo(LuzAtor );
				while (!testaSobreposicao(ini)) sorteiaInimigo(ini, Math.floor(Math.random() * 4));
			}
			UI_wave_qtq_ini++;
			UI_wave_corrente ++;
			
			avisoWaves();
			
		}
		
		
		private function avisoWaves():void {
			TF.text = "WAVE " + UI_wave_corrente.toFixed(0);
			TF.x = stage.stageWidth - TF.width ;
			TF.y = stage.stageHeight -TF.height ;
			stage.addChild(TF);
			TF.parent.setChildIndex( TF , TF.parent.numChildren - 1);
		}
		
		private function geraNovosInimigos():void 
		{
			trace(UI_qtd_inimigos);
			
/*			if (UI_qtd_inimigos < UI_Inimigos_Qtd_Max )
			{
				var ini:Inimigo = new Inimigo();
				var sort:uint = Math.floor(Math.random() * 4);
				sorteiaInimigo(ini, sort)
				ini.Alvo = AH_Heroi;
				adicionaAtor(ini);
				ini.adcionaClassehitGrupo(Inimigo);
				ini.adcionaClassehitGrupo(LuzAtor );
				while (!testaSobreposicao(ini)) sorteiaInimigo(ini, Math.floor(Math.random() * 4));
			}
*/		}
				
		private function geraInimigos():void 
		{
			var ini:Inimigo;
			
			UI_qtd_inimigos = 0;
			
			for (var i:uint = 0 ; i < UI_Inimigos_Qtd_Max ; i++) {
				ini = new Inimigo();
				var sort:uint = Math.floor(Math.random() * 4);
				sorteiaInimigo(ini, sort)
				ini.Alvo = AH_Heroi;
				adicionaAtor(ini);
				ini.adcionaClassehitGrupo(Inimigo);
				ini.adcionaClassehitGrupo(LuzAtor );
				while (!testaSobreposicao(ini)) sorteiaInimigo(ini, Math.floor(Math.random() * 4));
			}
		}
		
		
		private function sorteiaInimigo(ini:Inimigo,sort:uint):void {

			switch (sort) 
			{
				case 0 :
					ini.x = ( Math.random() * ( stage.stageWidth + 10) ) - 5;
					ini.y = -ini.height;
				break;
				case 1 :
					ini.x = ( Math.random() * ( stage.stageWidth + 10) ) - 5 ;
					ini.y = stage.stageHeight + ini.height;
				break;
				case 2 :
					ini.x = -ini.width;
					ini.y = ( Math.random() * ( stage.stageHeight + 10) ) - 5 ;
				break;
				case 3 :
					ini.x = stage.stageWidth + ini.width;
					ini.y = ( Math.random() * ( stage.stageHeight + 10) ) - 5 ;
				break;
				default:
			} 
		}
		
		private function randomizaPosicaoInimigo(_ini:Inimigo):void
		{	
			_ini.x = Utils.Rnd( 0 , this.width );
			_ini.y = Utils.Rnd( 0  , this.height );			
		}
		
		
		private function testaSobreposicao(_ator:AtorBase):Boolean
		{
			for each (var ator:AtorBase in Atores)
			{
				if (ator != _ator) {if (_ator.hitTestObject(ator)) return false}
			}
			return true;
		}
		
		/***********************************************************
		 * métodos privados
		 ***********************************************************/
		
		private function geraFundo():Sprite
		{
			var sp:Sprite = new Sprite;
			sp.graphics.lineStyle();
			sp.graphics.beginFill(0X0099C, 1);
			//sp.graphics.beginBitmapFill(new seawaterbmp);
			sp.graphics.drawRect(0, 0, UI_mapa_Largura, UI_mapa_Altura);
			sp.graphics.endFill();
			sp.graphics.beginFill(0X0099C, 0.5);
			sp.graphics.drawRect(0, 0, UI_mapa_Largura, UI_mapa_Altura);
			sp.graphics.endFill();
			return sp;
		}
	}

}